package com.hyacinth.cloudnote.modules.note.converter;

import com.hyacinth.cloudnote.common.converter.AbstractConverter;
import com.hyacinth.cloudnote.common.exception.ExceptionHolder;
import com.hyacinth.cloudnote.modules.note.dto.TagDTO;
import com.hyacinth.cloudnote.modules.note.model.Tag;
import com.hyacinth.cloudnote.modules.note.repository.TagRepository;
import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import static com.hyacinth.cloudnote.modules.common.errorcode.NoteErrorCode.E1000000001;

/**
 * Tag实体与DTO之间接口数据转换实现
 * @author zhangfb
 */
@Component
public class TagConverter extends AbstractConverter<Tag, TagDTO> {
    @Autowired
    private TagRepository tagRepository;

    @Override
    public Tag toModel(@NonNull final TagDTO dto) {
        if (dto.isNew()) {
            return constructModel(dto);
        } else {
            return updateModel(dto);
        }
    }

    @Override
    public TagDTO toDTO(@NonNull final Tag model) {
        final TagDTO dto = new TagDTO();

        dto.setId(model.getId());
        dto.setName(model.getName());
        dto.setNoteNum(model.getNoteNum());

        this.convertCommonToDTO(model, dto);

        return dto;
    }

    /**
     * 构建新Model
     */
    private Tag constructModel(final TagDTO dto) {
        final Tag model = new Tag();

        this.dtoToModel(dto, model);
        return model;
    }

     /**
      * 更新Model
      */
    private Tag updateModel(final TagDTO dto) {
        final Tag model = this.tagRepository.findById(dto.getId())
                        .orElseThrow(() -> ExceptionHolder.serviceException(E1000000001, "标签-" + dto.getId()));
        this.dtoToModel(dto, model);
        return model;
    }

    private void dtoToModel(final TagDTO dto, final Tag model) {
        model.setName(dto.getName());
    }
}
